package cn.teawooo.tree.node;

import java.util.List;

/**
 * 功能描述：节点
 * @author teawooo <long1795@gmail.com>
 * @time 2013年8月26日 下午1:47:47
 */
public interface Node<T> {

    /**
     * 是否根节点
     * @return 是否根节点
     */
    boolean isRoot();

    /**
     * 是否叶子节点
     * @return 是否叶子节点
     */
    boolean isLeaf();

    /**
     * 获取节点名称
     * @return 当前节点名称
     */
    String getName();

    /**
     * 获取节点数据
     * @return 当前节点数据
     */
    T getData();

    /**
     * 获取父节点
     * @return 父节点
     */
    <P extends Node<T>> P getParent();

    /**
     * 获取父节点链
     * @return 父节点链
     */
    <P extends Node<T>> List<P> getParentChain();

    /**
     * 获取子节点集
     * @return 子节点集
     */
    <C extends Node<T>> List<C> getChildren();

    /**
     * 生长子节点
     * @param child 子节点
     * @return 当前节点
     */
    <C extends Node<T>> C grown(C child);

    /**
     * 生长子节点集
     * @param childs 子节点集
     * @return 当前节点
     */
    <C extends Node<T>> C grown(List<C> childs);

    /**
     * 生长并返回子节点
     * @param child 子节点
     * @return 子节点
     */
    <C extends Node<T>> C grownAndReturnChild(C child);

    /**
     * 挂载到父节点
     * @param parent 父节点
     * @return 当前节点
     */
    <P extends Node<T>> P mount(P parent);

    /**
     * 挂载到父节点并返回父节点
     * @param parent 父节点
     * @return 父节点
     */
    <P extends Node<T>> P mountAndReturnParent(P parent);

}
